package com.wxxymakers.grademark.utils;

import com.wxxymakers.grademark.model.entity.*;

import java.util.List;

/**
 * @AUTHOR soft
 * @DATE 2019/1/1 14:55
 * @DESCRIBE 记录统计分数小工具
 */
public class RecordMarkUtils {

    /**
     * 为记录进行评分
     * 评分默认项目在规定的统计时间内
     * @param item 要记录的项目
     * @param record 记录
     * @return 所得分数
     */
    public static float mark(WxItem item, WxItemRecord record) {
        float rate = 1.0F; // 默认的比率
        float max = item.getMaxScore();
        if (item.getNeedEnd()) {
            WxIncident incident = record.getIncident(); // 事件在验证区间合法性时设置的

            String placeId = record.getPlaceId();

            if (!(item.getId() + "_0").equals(placeId)) { // 不是主持人，只能拿到结项分
                if (record.getEndTime().after(incident.getEndRange())) {
                    return 0F; // 没结项就没分
                }
                rate = 0.5F;
            } else { // 是主持人
                if (record.getEndTime().after(incident.getEndRange()) ||
                        record.getBeginTime().before(incident.getBeginRange())) {
                    rate = 0.5F; // 没有结项或立项不在区间内的 得一半分
                }
            }
        }

        WxItemRank rank = getRankByRId(item.getRanks(), record.getItemRankId());
        WxItemPlace place = getPlaceByPId(item.getPlaces(), record.getPlaceId());

        float score = count(max, rank, place) * rate;
        if (item.getTisAdd()) {
            return score;
        } else {
            return -1 * score;
        }
    }

    /**
     * 根据rank id在rank列表中查找
     * @param ranks 列表
     * @param rankId id
     */
    private static WxItemRank getRankByRId(List<WxItemRank> ranks, String rankId) {
        for (WxItemRank rank : ranks) {
            if (rank.getId().equals(rankId)) {
                return rank;
            }
        }
        return null;
    }

    /**
     * 根据place id在place列表中查找
     * @param places 列表
     * @param placeId id
     */
    private static WxItemPlace getPlaceByPId(List<WxItemPlace> places, String placeId) {
        for (WxItemPlace place : places) {
            if (place.getId().equals(placeId)) {
                return place;
            }
        }
        return null;
    }

    /**
     * 计算分数
     * @param max 最大分值
     * @param rank 所在等级
     * @param place 所在地位
     */
    private static float count(float max, WxItemRank rank, WxItemPlace place) {
        if (rank == null || place == null) return max; // 防报错 预计不可能出现的情况
        float rankRatio = rank.getRatio();
        if (rankRatio == 0) {
            rankRatio = rank.getScore() / max;
        }
        float placeRatio = place.getRatio();
        if (placeRatio == 0) {
            placeRatio = place.getScore() / max;
        }

        return max * rankRatio * placeRatio;
    }
}
